package com.wlyy.bcwlw.common.utils;

import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.StringConverter;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.wlyy.bcwlw.common.export2excel.exception.ImpExpException;

/**
 * 
 * @ClassName. ExcelUtil
 * @Description. 对Excel 进行操作的一些方法
 * @author zhangyang
 * @date 2016年5月30日 上午11:34:35
 * @version V1.0
 */
public class ExcelUtil {

	/**
	 * 
	* @Title. getCell
	* @Description. 获得工作表的某个单元格，如果不存在则创建一个新的单元格
	* @param sheet 工作表
	* @param row 单元格行号
	* @param col 单元格列号
	* @return HSSFCell 坐标为（row,col)的单元格
	* @exception.
	 */
	public static HSSFCell getCell(HSSFSheet sheet,int row,int col){
		HSSFRow sheetRow = sheet.getRow(row);
		if(null == sheetRow){
			sheetRow = sheet.createRow(row);
		}
		HSSFCell cell = sheetRow.getCell(col);
		if(null == cell){
			cell = sheetRow.createCell(col);
		}
		return cell;
	}
	
	/**
	 * 
	* @Title. setText
	* @Description. 设置单元格内容，内容类型为文本类型
	* @param cell   单元格
	* @param item void  内容
	* @exception.
	 */
	public static void setText(HSSFCell cell,Object item){
		if(item instanceof BigDecimal){
			BigDecimal itemBigDecimal = (BigDecimal) item;
			cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
			cell.setCellValue(itemBigDecimal.doubleValue());
		}else{
			String text = "";
			Converter converter =  new StringConverter();
			text = (String) converter.convert(String.class, item);
			cell.setCellType(HSSFCell.CELL_TYPE_STRING);
			cell.setCellValue(text);
			
		}
	}
	
	/**
	 * 
	* @Title. setRow
	* @Description. 插入一行数据到工作表中
	* @param sheet	工作表
	* @param data	一行数据
	* @param row void 行号
	* @exception.
	 */
	public static void setRow(HSSFSheet sheet,List data,int row){
		Iterator it = data.iterator();
		int col = 0;
		HSSFCell cell;
		while(it.hasNext()){
			cell = getCell(sheet, row, col++);
			Object item = it.next();
			setText(cell, item);
		}
	}
	
	/**
	 * 
	* @Title. setRowWithStyle
	* @Description. 插入一行数据到工作表中并且带有样式
	* @param sheet 工作表
	* @param cellStyle 单元格样式
	* @param data	数据
	* @param row void 行号
	* @exception.
	 */
	public static void setRowWithStyle(HSSFSheet sheet,HSSFCellStyle cellStyle,List data,int row){
		Iterator it = data.iterator();
		int col = 0;
		HSSFCell cell;
		while(it.hasNext()){
			cell = getCell(sheet, row, col++);
			Object item = it.next();
			cell.setCellStyle(cellStyle);
			setText(cell, item);
		}
	}
	
	/**
	 * 
	* @Title. exportWorkBook
	* @Description. 输出工作簿到输出流
	* @param wb	工作簿
	* @param output 输出流
	* @throws ImpExpException void
	* @exception.
	 */
	public static void exportWorkBook(HSSFWorkbook wb,OutputStream output) throws ImpExpException{
		try{
			wb.write(output);
		}catch (IOException e){
			e.printStackTrace();
			throw new ImpExpException("Excel文件没找到", e);
		}
	}
	
	/**
	 * 
	* @Title. exportWorkBook2Response
	* @Description. 输出工作簿到web页面
	* @param wb	工作簿
	* @param response 响应
	* @throws ImpExpException void
	* @exception.
	 */
	public static void exportWorkBook2Response(HSSFWorkbook wb,HttpServletResponse response) throws ImpExpException{
		try{
			ServletOutputStream out = response.getOutputStream();
			wb.write(out);
			out.flush();
		} catch (IOException e){
			e.printStackTrace();
			throw new ImpExpException("Excel文件没找到", e);
		}
	}
}
